package cc.rengu.redp.common.utils;

public class CamelUtil {
    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>
     * 例如：HELLO_WORLD->helloWorld
     * @param name 转换前的下划线大写方式命名的字符串
     * @return 转换后的驼峰式命名的字符串
     */
    public static String underlineToCamel(String name) {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (name == null || name.isEmpty()) {
            // 没必要转换
            return "";
        } else if (!name.contains("_") && Character.isUpperCase(name.charAt(0))) { //此处技术上认为首字母小写即是驼峰命名，无需转换
            // 不含下划线且全部字幕大写的
            return name.toLowerCase();
        }
        // 用下划线将原始字符串分割
        String camels[] = name.split("_");
        for (String camel :  camels) {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty()) {
                continue;
            }
            // 处理真正的驼峰片段
            if (result.length() == 0) {
                // 第一个驼峰片段，全部字母都小写
                result.append(camel.toLowerCase());
            } else {
                // 其他的驼峰片段，首字母大写
                result.append(camel.substring(0, 1).toUpperCase());
                result.append(camel.substring(1).toLowerCase());
            }
        }
        return result.toString();
    }

    /**
     * 将驼峰转为下划线</br>
     * 例如：helloWorld->HELLO_WORLD
     * @param param 转换前的驼峰式命名的字符串
     * @return 转换后的下划线大写方式命名的字符串
     */
    public static String camelToUnderline(String param){
        if (param == null || "".equals(param.trim())){
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)){
                sb.append("_");
                sb.append(c);
            }else{
                sb.append(Character.toUpperCase(c));
            }
        }
        return sb.toString();
    }
}
